package com.zxj.judge.callback; // 定义包名

// 导入所需的类和接口
import cn.hutool.core.util.StrUtil; // Hutool工具类，用于字符串操作
import com.github.dockerjava.api.model.Frame; // Docker输出流的帧模型
import com.github.dockerjava.api.model.StreamType; // Docker输出流的类型枚举
import com.github.dockerjava.core.command.ExecStartResultCallback; // Docker命令执行结果的回调接口
import com.zxj.common.core.enums.CodeRunStatus; // 自定义的枚举类，表示代码运行状态
import lombok.Getter; // Lombok注解，用于自动生成getter方法
import lombok.Setter; // Lombok注解，用于自动生成setter方法

/**
 * Docker命令执行结果回调类
 */
@Getter
@Setter
public class DockerStartResultCallback extends ExecStartResultCallback {

    // 记录执行成功还是失败的状态
    private CodeRunStatus codeRunStatus;

    // 错误信息字符串
    private String errorMessage;

    // 正常信息字符串
    private String message;

    /**
     * 当接收到一个新的帧时调用此方法
     *
     * @param frame Docker输出流的帧
     */
    @Override
    public void onNext(Frame frame) {
        // 获取帧的流类型
        StreamType streamType = frame.getStreamType();

        // 如果流类型是标准错误输出（stderr）
        if (StreamType.STDERR.equals(streamType)) {
            // 如果错误信息字符串为空，则直接赋值
            if (StrUtil.isEmpty(errorMessage)) {
                errorMessage = new String(frame.getPayload());
            } else {
                // 否则，追加错误信息
                errorMessage = errorMessage + new String(frame.getPayload());
            }
            // 设置执行状态为失败
            codeRunStatus = CodeRunStatus.FAILED;
        } else {
            // 如果不是标准错误输出，则认为是正常信息
            message = new String(frame.getPayload());
            // 设置执行状态为成功
            codeRunStatus = CodeRunStatus.SUCCEED;
        }

        // 调用父类的onNext方法，继续处理帧
        super.onNext(frame);
    }
}